<?php
require_once( 'RelatorioController.php' );
require_once('../zAPI/properties.inc.php');
require_once( ROOT_CLASS . 'Kernel.class.php');
require_once( $kernel->getClass("Util") );
require_once( $kernel->getClass("BusinessObject") );
require_once( ROOT_CLASS . 'DataObject/MovimentoCaixaDO.class.php');
require_once( ROOT_DATA_OBJECT . 'DataObject.class.php');
?>



<?php 

class MovimentoCaixaController{
	
	function __construct(){
		$AccessAction = new AccessAction();
		$AccessAction->validSessionUsuario();
    }	
	
	function listarMovimentosCaixa($instanceDB, $postRequest, $getRequest){
		
		$limit = $postRequest["limit"]; // var usada para controlar o limite de paginação
		$start = $postRequest["start"]; // variável usada para controlar o in?cio de paginação
		
		$movimentoCaixaBO = new MovimentoCaixaBO();
		$codigoProjeto = $postRequest["Projeto_codigo"];
		$codigoDotacao = $postRequest["Dotacao_codigo"];
		$dataInicio = $postRequest["dataInicio"];
		$dataFim = $postRequest["dataFim"];
			
		$result = $movimentoCaixaBO->listarMovimentosCaixa($instanceDB, $limit, $start, $codigoProjeto, $codigoDotacao, $dataInicio, $dataFim);
	
		$saldos = $this->calculaSaldos($result["all"]);
		
		$listMovimentacoes = $this->formataMovimentacoes($result["object"], $saldos["valorEntrada"], $saldos["valorSaida"], $saldos["saldoFinal"]);
		
		$retorno = "{";
			$retorno .= "success 	: true,";
			$retorno .= "results	: ".$result["qtdRegistros"].",";
			$retorno .= "message	: 'Movimentações listadas com sucesso',";
			$dados = "";
			$aux = "";
			for ($i = 0; $i < count($listMovimentacoes); $i++){
				$dados .= $aux . utf8_encode( $listMovimentacoes[$i]->transformDataObjectToJSON() );
				$aux = ",";
			}
			$retorno .= "elements : [" . $dados . "]";
		$retorno .= "}";
			
		return $retorno;
			
		
		
		
	}
	
	
		
	/*
	 * @description: Recebe código do projeto e lista as movimentações desse projeto
	 * @author: Leandro Gimenez
	 * @params: $codigoProjeto(código do projeto)
	 * @return: lista com todas as movimentações do projeto
	*/		
	function listarMovimentacoesPorProjeto($instanceDB, $codigoProjeto, $limit, $start){
		
		$movimentoCaixaBO = new MovimentoCaixaBO();
		
		$result = $movimentoCaixaBO->listarMovimentacoesPorProjeto($instanceDB, $codigoProjeto, $limit, $start);
		
		$saldos = $this->calculaSaldos($result["all"]);
			
		$listMovimentacoes = $this->formataMovimentacoes($result["object"], $saldos["valorEntrada"], $saldos["valorSaida"], $saldos["saldoFinal"]);
		
		
		$retorno = "{";
			$retorno .= "success 	: true,";
			$retorno .= "results	: ".$result["qtdRegistros"].",";
			$retorno .= "message	: 'Movimentações do projeto listadas com sucesso',";
			$dados = "";
			$aux = "";
			for ($i = 0; $i < count($listMovimentacoes); $i++){
				$dados .= $aux . utf8_encode( $listMovimentacoes[$i]->transformDataObjectToJSON() );
				$aux = ",";
			}
			$retorno .= "elements : [" . $dados . "]";
		$retorno .= "}";
			
		return $retorno;
	}
	
	/*
	 * @description: Recebe período de datas (ex: 10/02/2011 a 10/07/2011) e retorna as movimentações nesse período
	 * @author: Leandro Gimenez
	 * @params: $dataInicio e $dataFim (intervalo de datas para delimitar o período)
	 * @return: lista com todas as movimentações no período indicado
	*/	
	function listarMovimentacoesPorPeriodo($instanceDB, $postRequest, $getRequest){
		
		$movimentoCaixaBO = new MovimentoCaixaBO();
				
		$objKernel = new Kernel();
		$dataInicio = $objKernel->stringToSqlDate($_POST["dataInicio"]);
		$dataFim = $objKernel->stringToSqlDate($_POST["dataFim"]);
		
		$result = $movimentoCaixaBO->listarMovimentacoesPorPeriodo($instanceDB, $dataInicio, $dataFim);		
		
		$retorno = "{";
			$retorno .= "success 	: true,";
			$retorno .= "message	: 'Movimentações listadas com sucesso',";
			$dados = "";
			$aux = "";
			for ($i = 0; $i < count($result); $i++){
				$dados .= $aux . utf8_encode( $result[$i]->transformDataObjectToJSON() );
				$aux = ",";
			}
			$retorno .= "elements : [" . $dados . "]";
		$retorno .= "}";
			
		return $retorno;
	}	
	
	function calculaSaldos($listMovimentos){
		$valorEntrada = 0.0;
		$valorSaida = 0.0;
		
		for($i=0; $i < count($listMovimentos); $i++){
			if($listMovimentos[$i]->get("tipo") == "D"){
				$valorSaida += $listMovimentos[$i]->get("valorOperacao");
			}else if($listMovimentos[$i]->get("tipo") == "C"){
				$valorEntrada += $listMovimentos[$i]->get("valorOperacao");
			}
		}
		
		$saldoFinal = $valorEntrada - $valorSaida; 
		
		$retorno = array("valorEntrada" => $valorEntrada, "valorSaida" => $valorSaida, "saldoFinal" => $saldoFinal);
		
		return $retorno;
	}
	
	function formataMovimentacoes($listMovimentos, $valorEntrada, $valorSaida, $saldoFinal){
		for($i=0; $i < count($listMovimentos); $i++){
			
			$listMovimentos[$i]->add("dataMovimentacao2", $listMovimentos[$i]->get("dataMovimentacao"));
			$listMovimentos[$i]->add("valorEntrada", $valorEntrada);
			$listMovimentos[$i]->add("valorSaida", $valorSaida);
			$listMovimentos[$i]->add("saldoFinal", $saldoFinal);
			
			if($listMovimentos[$i]->get("tipo") == "D"){
				$listMovimentos[$i]->set("valorOperacao", ($listMovimentos[$i]->get("valorOperacao")*-1));
			}
			
		}
		
		return $listMovimentos;
	}
	
	function inserir($instanceDB, $postRequest, $getRequest){
		
		$movimentoCaixaBO = new MovimentoCaixaBO();
		$movimentoCaixaDO = new MovimentoCaixaDO();
		
		$dotacaoBO = new DotacaoBO();
		
		$movimentoCaixaDO->loadDataObjectByPost( $_POST, TRUE );
		
		$AccessAction = new AccessAction();
		$usuarioSessao = $AccessAction->capturarSessaoUsuario();
		
		$movimentoCaixaDO->set("usuarioMovimento", $usuarioSessao->get("codigo"));
		$valorOperacao = $movimentoCaixaDO->get("valorOperacao");
		$tipo = $movimentoCaixaDO->get("tipo");
		
		$aux = $dotacaoBO->calculaSaldoDotacao($instanceDB,$movimentoCaixaDO->get("Dotacao_codigo"));
		
		$numberFormatted = number_format($aux, 2, ',', '.');
		
		
		
		
		if($valorOperacao > $aux && $tipo == "D"){
			
			$retorno = "{";
			$retorno .="success : false,";
			$retorno .="message : 'Valor da operação é maior que o saldo. Saldo disponível é de: R$ $numberFormatted '";
			$retorno .="}";
			
			return $retorno;
		}
		
		if($movimentoCaixaDO->get("Atividade_codigo") != ""){
			$count = $movimentoCaixaBO->validaManipulacao($instanceDB, $movimentoCaixaDO->get("Atividade_codigo"));
			if($count[0]->get("result") == 1){
				$retorno = "{";
				$retorno .="success : false,";
				$retorno .="message : 'Atividade já possui movimento de caixa relacionado, selecione outra'";
				$retorno .="}";		
				
				return $retorno;
			}
		}
		
	
		$result = $movimentoCaixaBO->inserir($instanceDB, $movimentoCaixaDO);
		
		
		
		
		if ( $result === FALSE ){
			$retorno = "{";
			$retorno .="success : false,";
			$retorno .="message : 'Não foi possível inserir as informações.'";
			$retorno .="}";
		} else {
			
			if(isset($postRequest["Atividade_codigo"]) && $postRequest["Atividade_codigo"] != ""){
				$atividadeBO = new AtividadeBO();
				$atividadeBO->encerrarAtividade($instanceDB, $postRequest["Atividade_codigo"]);
			}
			
			
			$retorno .="{";
			$retorno .="success : true,";
			$retorno .="message : 'Inserido com com sucesso!',";
			$dados = "";
			$aux = "";
			for ($i = 0; $i < count($result); $i++){
				$dados .= $aux . utf8_encode( $result[$i]->transformDataObjectToJSON() );
				$aux = ",";
			}
			$retorno .="elements : [" . $dados . "]";
			$retorno .="}";
		}
		
		return $retorno;
	}
	
	function excluir($instanceDB, $postRequest, $getRequest){
			
		$movimentoCaixaBO = new MovimentoCaixaBO();
		$movimentoCaixaDO = new MovimentoCaixaDO();
		
		$codigoMovimentoCaixa = $postRequest["codigoMovimentoCaixa"];
		$movimentoCaixaDO->set("codigo", $codigoMovimentoCaixa );
		
		
		$objetoMovimento = $movimentoCaixaBO->capturarMovimentoCaixa($instanceDB, $codigoMovimentoCaixa);
		
		$result = $movimentoCaixaBO->excluir( $instanceDB, $movimentoCaixaDO );
		
		if ($result === FALSE){
			$retorno = "{";
			$retorno .= "success : false,";
			$retorno .= "message : 'Não foi possível excluir o registro.'";
			$retorno .= "}";
		}else {
			if($objetoMovimento[0]->get("Atividade_codigo") != "" && $objetoMovimento[0]->get("Atividade_codigo")){
				
				$atividadeBO = new AtividadeBO();
				$atividadeBO->ativarAtividade($instanceDB, $objetoMovimento[0]->get("Atividade_codigo"));
								
			}
			
			$retorno .= "{";
			$retorno .= "success : true,";
			$retorno .= "message : 'Excluído com sucesso!'";
			$retorno .= "}";
		}
		
		return $retorno;
	}


	function alterar($instanceDB, $postRequest, $getRequest){
		
		$movimentoCaixaBO = new MovimentoCaixaBO();
		$movimentoCaixaDO = new MovimentoCaixaDO();
		$dotacaoBO = new DotacaoBO();
		
		$movimentoCaixaDO->loadDataObjectByPost( $_POST, TRUE );
		
		$AccessAction = new AccessAction();
		$usuarioSessao = $AccessAction->capturarSessaoUsuario();
		
		$movimentoCaixaDO->set("usuarioMovimento", $usuarioSessao->get("codigo"));
		
		$objetoMovimento = $movimentoCaixaBO->capturarMovimentoCaixa($instanceDB, $movimentoCaixaDO->get("codigo"));
	
		$aux = $dotacaoBO->calculaSaldoDotacao($instanceDB,$movimentoCaixaDO->get("Dotacao_codigo"));
		$aux += $objetoMovimento[0]->get("valorOperacao");
		//echo $aux;
		$numberFormatted = number_format($aux, 2, ',', '.');
		
		if($movimentoCaixaDO->get("valorOperacao") > $aux && $movimentoCaixaDO->get("tipo") == "D"){
			
			$retorno = "{";
			$retorno .="success : false,";
			$retorno .="message : 'Valor da operação é maior que o saldo. Saldo disponível é de: R$ $numberFormatted '";
			$retorno .="}";
			
			return $retorno;
		}
		
		
		$result = $movimentoCaixaBO->alterar( $instanceDB, $movimentoCaixaDO );
			
		if ( $result === FALSE){
			$retorno = "{";
			$retorno .= "success : false,";
			$retorno .= "message : 'Não foi possível alterar o registro.'";
			$retorno .= "}";
		}else {
			$retorno .=  "{";
			$retorno .= "success : true,";
			$retorno .= "message : 'Alterado com sucesso!'";
			$retorno .= "}";
		}
		
		return $retorno;
	}	
	
	
	function capturarMovimentoCaixa($instanceDB, $postRequest, $getRequest){

		$movimentoCaixaBO = new MovimentoCaixaBO();
		$result = $movimentoCaixaBO->capturarMovimentoCaixa($instanceDB, $postRequest["codigo"]);

		$retorno = "{";
		$retorno .= "success 	: true,";
		$retorno .= "message	: 'Movimento capturado com sucesso',";
		$dados = "";
		$aux = "";
		for ($i = 0; $i < count($result); $i++){
			$dados .= $aux . utf8_encode( $result[$i]->transformDataObjectToJSON() );
			$aux = ",";
		}
		$retorno .= "elements : [" . $dados . "]";
		$retorno .= "}";
				
		return $retorno;
	}
	
	/*
	function teste(){
		$relatorioController = new RelatorioController();
		$relatorioController->relatorioTeste();
	}
	*/
	
	
}

?>